package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.dto.CallAccountUserIdInDTO;
import com.xbongbong.paas.pojo.dto.CallCenterAccountUserInfoDTO;
import com.xbongbong.paas.pojo.dto.CallCenterAdminDTO;
import com.xbongbong.paas.pojo.dto.CallCenterAgentDTO;
import com.xbongbong.paas.pojo.dto.CallCenterSupervisorDTO;
import com.xbongbong.paas.pojo.dto.CallSocketReckonDTO;
import com.xbongbong.paas.pojo.dto.CallUpdateAccountDTO;
import com.xbongbong.paas.pojo.vo.CallCenterAccountGetByMobileVO;
import com.xbongbong.paas.pojo.vo.CallCenterAccountUserInfoVO;
import com.xbongbong.paas.pojo.vo.CallCenterAdminVO;
import com.xbongbong.paas.pojo.vo.CallCenterAgentVO;
import com.xbongbong.paas.pojo.vo.CallCenterSupervisorVO;
import com.xbongbong.paas.pojo.vo.CallSocketReckonVO;
import com.xbongbong.paas.pojo.vo.CallUpdateAccountVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.XbbResponse;
import com.xbongbong.saas.domain.entity.CallCenterAccountEntity;
import com.xbongbong.saas.domain.entity.CallCenterTeamEntity;
import com.xbongbong.sys.domain.entity.UserEntity;

import java.util.List;

/**
 * @author youli.chen
 * @version v1.0
 * @description: 呼叫中心账户 业务层
 * @date 2019/2/12 15:39
 * @since v1.0
 */
public interface CallCenterAccountService {

    /**
     * 根据销帮帮CRM的用户信息获取话务中心的平台账号
     *
     * @param callCenterAccountUserInfoDTO 话务中心平台账户 不存在则返回null
     * @return CallCenterAccountUserInfoVO 根据销帮帮CRM的用户信息获取话务中心的平台账号回参
     * @throws XbbException
     */
    CallCenterAccountUserInfoVO getByXbbUserInfo(CallCenterAccountUserInfoDTO callCenterAccountUserInfoDTO) throws XbbException;

    /**
     * 根据号码获取账号详情
     *
     * @param mobile     号码
     * @param moduleType 话务中心识别号
     * @return CallCenterAccountGetByMobileVO 根据号码获取账号详情回参
     * @throws XbbException
     */
    CallCenterAccountGetByMobileVO getByMobile(String mobile, Integer moduleType) throws XbbException;

    /**
     * 更新第三方话务中心的账号信息
     *
     * @param apiKey                  平台维护的apiKey
     * @param callCenterAccountEntity 本地维护的话务中心账号信息
     * @return boolean 是否更新成功
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    boolean updateThirdPlatformAccount(String apiKey, CallCenterAccountEntity callCenterAccountEntity) throws XbbException;

    /**
     * 在话务中心注册员工并同步本地账号系统
     *
     * @param registerUserEntity 用户表查询出来的用户
     * @param moduleType         平台信息，参考CallCenterTypeEnum
     * @param apiKey             平台维护的apiKey
     * @return boolean 是否更新成功
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    boolean saveAccount(UserEntity registerUserEntity, Integer moduleType, String apiKey) throws XbbException;

    /**
     * 查询指定用户Id列表的用户
     *
     * @param corpid     公司id
     * @param moduleType 平台信息，参考CallCenterTypeEnum
     * @return Integer 坐席数量
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    Integer countAgentNum(String corpid, Integer moduleType) throws XbbException;

    /**
     * 员工设置坐席状态
     *
     * @param callCenterAgentDTO 员工设置坐席状态入参
     * @return CallCenterAccountGetByMobileVO 员工设置坐席状态回参
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    XbbResponse<CallCenterAgentVO> agent(CallCenterAgentDTO callCenterAgentDTO) throws XbbException;

    /**
     * 员工设置团队主管
     *
     * @param callCenterSupervisorDTO 员工设置团队主管入参
     * @return CallCenterSupervisorVO 员工设置团队主管回参
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    XbbResponse<CallCenterSupervisorVO> accountSupervisor(CallCenterSupervisorDTO callCenterSupervisorDTO) throws XbbException;

    /**
     * 员工设置超管状态
     *
     * @param callCenterAdminDTO 员工设置超管状态入参
     * @return CallCenterAdminVO 员工设置超管状态回参
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    XbbResponse<CallCenterAdminVO> accountAdmin(CallCenterAdminDTO callCenterAdminDTO) throws XbbException;

    /**
     * 获取并更新客户端及版本号
     *
     * @param callUpdateAccountDTO 获取并更新客户端及版本号入参
     * @return CallUpdateAccountVO 获取并更新客户端及版本号回参
     * @throws XbbException 封装的异常
     * @author youli.cehn
     */
    XbbResponse<CallUpdateAccountVO> updateAccount(CallUpdateAccountDTO callUpdateAccountDTO) throws XbbException;

    /**
     * 呼叫统计
     *
     * @param callSocketReckonDTO 入参
     * @return com.xbongbong.paas.pojo.vo.CallSocketReckonVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2019/6/26 15:30
     * @since v1.0
     */
    CallSocketReckonVO reckon(CallSocketReckonDTO callSocketReckonDTO) throws XbbException;

    /**
     * 设置为话务中心的坐席
     *
     * @param apiKey                  平台维护的apiKey
     * @param callCenterAccountEntity 话务平台员工信息
     * @param callCenterTeamEntity    话务平台的团队信息
     * @param isAgent                 是否为坐席
     * @return boolean 是否保存成功
     * @throws XbbException 封装的异常
     */
    boolean setAgent(String apiKey, CallCenterAccountEntity callCenterAccountEntity,
                     CallCenterTeamEntity callCenterTeamEntity, boolean isAgent) throws XbbException;

    /**
     * 设置为话务中心的团队主管
     *
     * @param apiKey                  平台维护的apiKey
     * @param callCenterAccountEntity 话务平台员工信息
     * @param isSupervisor            是否为团队主管
     * @return boolean 是否保存成功
     * @throws XbbException 封装的异常
     */
    boolean setSupervisor(String apiKey, CallCenterAccountEntity callCenterAccountEntity, boolean isSupervisor) throws XbbException;

    /**
     * 设置为话务中心的超管
     *
     * @param apiKey                  平台维护的apiKey
     * @param callCenterAccountEntity 话务平台员工信息
     * @param isAdmin                 是否为超管
     * @return boolean 是否保存成功
     * @throws XbbException 封装的异常
     */
    boolean setAdmin(String apiKey, CallCenterAccountEntity callCenterAccountEntity, boolean isAdmin) throws XbbException;

    /**
     * 查询指定用户Id列表的用户
     *
     * @param callAccountUserIdInDTO 查询指定用户Id列表的用户入参
     * @return List<CallCenterAccountEntity>
     * @throws XbbException 封装的异常
     */
    List<CallCenterAccountEntity> getByUserIdIn(CallAccountUserIdInDTO callAccountUserIdInDTO);

    /**
     * 获取所有坐席的用户id
     *
     * @param corpid     公司id
     * @param moduleType 平台信息，参考AppStoreTypeEnum
     *
     * @return List<String> 用户id队列
     * @author 章华隽
     * 创建时间：2018/1/2 下午9:40
     * 修改时间：
     * @version
     * @since 3.15.1
     */
    List<String> getAllAgentUserIdList(String corpid, Integer moduleType);

    /**
     * 获取所有坐席的用户id
     *
     * @param corpid     公司id
     * @param moduleType 平台信息，参考AppStoreTypeEnum
     * @param depId      部门id
     *
     * @return List<String> 用户id队列
     * @author 章华隽
     * 创建时间：2018/1/2 下午9:40
     * 修改时间：
     * @version
     * @since 3.15.1
     */
    List<String> getSubAgentUserIdList(String corpid, Integer moduleType, Long depId);

}
